home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / mysql / scripts / mysql_zap < prev    next >
Text File  |  2005-04-01  |  3KB  |  157 lines

  1. #!/usr/bin/perl
  2. # This is a utility for MySQL. It is not needed by any standard part
  3. # of MySQL.
  4.  
  5. # Usage: mysql_zap [-signal] [-f] [-t] pattern
  6.  
  7. # Configuration parameters.
  8.  
  9. $sig = "";            # Default to try all signals
  10. $ans = "y";
  11. $opt_f= 0;
  12. $opt_t= 0;
  13. $opt_a = "";
  14.  
  15. $BSD = -f '/vmunix' || $ENV{"OS"} eq "SunOS4" || $^O eq 'darwin';
  16. $LINUX = $^O eq 'linux';
  17. $pscmd = $BSD ? "/bin/ps -auxww" : $LINUX ? "/bin/ps axuw" : "/bin/ps -ef";
  18.  
  19. open(TTYIN, "</dev/tty") || die "can't read /dev/tty: $!";
  20. open(TTYOUT, ">/dev/tty") || die "can't write /dev/tty: $!";
  21. select(TTYOUT);
  22. $| = 1;
  23. select(STDOUT);
  24. $SIG{'INT'} = 'cleanup';
  25.  
  26. while ($#ARGV >= $[ && $ARGV[0] =~ /^-/) {
  27.     if ($ARGV[0] =~ /(ZERO|HUP|INT|QUIT|ILL|TRAP|ABRT|EMT|FPE|KILL|BUS|SEGV|SYS|PIPE|ALRM|TERM|URG|STOP|TSTP|CONT|CLD|TTIN|TTOU|IO|XCPU|XFSZ|VTALRM|PROF|WINCH|LOST|USR1|USR2)/ || $ARGV[0] =~ /-(\d+)$/) {
  28.     $sig = $1;
  29.     } elsif ($ARGV[0] eq "-f") {
  30.     $opt_f=1;
  31.     } elsif ($ARGV[0] eq "-t") {
  32.     $opt_t=1;
  33.     $ans = "n";
  34.     }
  35.     elsif ($ARGV[0] eq "-a")
  36.     {
  37.     $opt_a = 1;
  38.     }
  39.     elsif ($ARGV[0] eq "-?" || $ARGV[0] eq "-I" || $ARGV[0] eq "--help")
  40.     {
  41.     &usage;
  42.     }
  43.     else {
  44.     print STDERR "$0: illegal argument $ARGV[0] ignored\n";
  45.     }
  46.     shift;
  47. }
  48.  
  49. &usage if $#ARGV < 0;
  50.  
  51. if (!$opt_f)
  52. {
  53.     if ($BSD) {
  54.     system "stty cbreak </dev/tty >/dev/tty 2>&1";
  55.     }
  56.     else {
  57.     system "stty", 'cbreak',
  58.     system "stty", 'eol', '^A';
  59.     }
  60. }
  61.  
  62. open(PS, "$pscmd|") || die "can't run $pscmd: $!";
  63. $title = <PS>;
  64. print TTYOUT $title;
  65.  
  66. # Catch any errors with eval.  A bad pattern, for instance.
  67. eval <<'EOF';
  68. process: while ($cand = <PS>)
  69. {
  70.     chop($cand);
  71.     ($user, $pid) = split(' ', $cand);
  72.     next if $pid == $$;
  73.     $found = !@ARGV;
  74.     if ($opt_a) { $found = 1; }
  75.     foreach $pat (@ARGV)
  76.     {
  77.     if ($opt_a)
  78.     {
  79.         if (! ($cand =~ $pat))
  80.         {
  81.         next process;
  82.         }
  83.     }
  84.     else
  85.     {
  86.         $found = 1 if $cand =~ $pat;
  87.     }
  88.     }
  89.     next if (!$found);
  90.     if (! $opt_f && ! $opt_t)
  91.     {
  92.     print TTYOUT "$cand? ";
  93.     read(TTYIN, $ans, 1);
  94.     print TTYOUT "\n" if ($ans ne "\n");
  95.     }
  96.     else
  97.     {
  98.     print TTYOUT "$cand\n";
  99.     }
  100.     if ($ans =~ /^y/i) { &killpid($sig, $pid); }
  101.     if ($ans =~ /^q/i) { last; }
  102. }
  103. EOF
  104.  
  105. &cleanup;
  106.  
  107.  
  108. sub usage {
  109.     print <<EOF;
  110. Usage:   $0 [-signal] [-?Ift] [--help] pattern
  111. Options: -I or -? "info"  -f "force" -t "test".
  112.  
  113. Version 1.0
  114. Kill processes that match the pattern.
  115. If -f isn't given, ask user for confirmation for each process to kill.
  116. If signal isn't given, try first with signal 15, then with signal 9.
  117. If -t is given, the processes are only shown on stdout.
  118. EOF
  119.     exit(1);
  120. }
  121.  
  122. sub cleanup {
  123.     if ($BSD) {
  124.     system "stty -cbreak </dev/tty >/dev/tty 2>&1";
  125.     }
  126.     else {
  127.     system "stty", 'icanon';
  128.     system "stty", 'eol', '^@';
  129.     }
  130.     print "\n";
  131.     exit;
  132. }
  133.  
  134. sub killpid {
  135.     local($signal,$pid) = @_;
  136.     if ($signal)
  137.     {
  138.     kill $signal,$pid;
  139.     }
  140.     else
  141.     {
  142.     print "kill -15\n";
  143.     kill 15, $pid;
  144.     for (1..5) {
  145.         sleep 2;
  146.         return if kill(0, $pid) == 0;
  147.     }
  148.     print "kill -9\n";
  149.     kill 9, $pid;
  150.     for (1..5) {
  151.         sleep 2;
  152.         return if kill(0, $pid) == 0;
  153.     }
  154.     print "$pid will not die!\n";
  155.     }
  156. }
  157.